package loja;

import helpers.Banco;
import helpers.Endereco;
import interfaces.ClienteInterface;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import exceptions.ClienteErroLoginException;
import exceptions.ClienteJaExistenteException;
import exceptions.ClienteNaoEncontradoException;

public class Cliente implements ClienteInterface {

	private String nome;

	private int id;

	private String email;

	private String login;

	private String senha;

	private String telefone;

	private String cpf;

	private Double credito;

	private Endereco endereco;

	public String getNome() {
		return nome;
	}

	public int getId() {
		return id;
	}

	public Double getCredito() {
		return credito;
	}

	public String getCpf() {
		return cpf;
	}

	private Cliente(String nome, String email, String login, String cpf,
			String rua, String numero, String cep, Double credito) {
		this.nome = nome;
		this.email = email;
		this.login = login;
		this.cpf = cpf;
		this.endereco = new Endereco(rua, cep, numero);
		this.credito = credito;
	}

	protected void adicionarCredito(double a) {
		this.credito += a;
	}

	protected void retirarCredito(double a) {
		this.credito -= a;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getEnderecoNumero() {
		return endereco.getNumero();
	}

	public String getEnderecoCep() {
		return endereco.getCep();
	}

	public String getEnderecoRua() {
		return endereco.getRua();
	}

	public String getEnderecoAdicional() {
		return endereco.getAdicional();
	}

	public void setEnderecoNumero(String numero) {
		this.endereco.setNumero(numero);
	}

	public void setEnderecoCep(String cep) {
		this.endereco.setCep(cep);
	}

	public void setEnderecoRua(String rua) {
		this.endereco.setRua(rua);
	}

	public void setEnderecoAdicional(String adicional) {
		this.endereco.setAdicional(adicional);
	}

	public String getEmail() {
		return email;
	}

	protected void setEmail(String email) {
		this.email = email;
	}

	public String getLogin() {
		return login;
	}

	public String getTelefone() {
		return telefone;
	}

	protected void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public static Cliente getClienteByLogin(String Login, String senha)
			throws ClienteNaoEncontradoException, ClienteErroLoginException {

		String sql = "select * from cliente where login = '" + Login + "'";
		ResultSet rs = Banco.retrieveQuery(sql);

		Cliente c = null;

		try {

			if (!rs.first()) {
				throw new ClienteNaoEncontradoException();
			}

			// rs.first();
			String passwd = rs.getString("passwd");
			if (!senha.equals(passwd)) {
				throw new ClienteErroLoginException();
			}

			String nome = rs.getString("nome");
			String cpf = rs.getString("cpf");
			Double credito = rs.getDouble("credito");
			String rua = rs.getString("end_rua");
			String cep = rs.getString("end_cep");
			String num = rs.getString("end_num");
			String adicional = rs.getString("end_add");
			String telefone = rs.getString("telefone");
			String login = rs.getString("login");
			String email = rs.getString("email");

			c = new Cliente(nome, email, login, cpf, rua, num, cep, credito);
			c.setTelefone(telefone);
			c.setEnderecoAdicional(adicional);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return c;

	}

	public static Cliente adicionarCliente(String nome, String email,
			String login, String passwd, String cpf, String rua, String numero,
			String cep, Double credito) throws ClienteJaExistenteException {

		String sql = "select count(id_cliente) from cliente where login = '"
				+ login + "'";
		int quantidade = Banco.getQuantidade(sql);

		Cliente c;

		if (quantidade >= 1)
			throw new ClienteJaExistenteException();

		c = new Cliente(nome, email, login, cpf, rua, numero, cep, credito);
		sql = "Insert into Cliente "
				+ "(nome, cpf, credito, end_rua, end_cep, end_num, login, passwd, email ) "
				+ "values (?,?,?,?,?,?,?,?,?)";
		try {
			PreparedStatement ps = Banco.prepareStatement(sql);
			ps.setString(1, nome);
			ps.setString(2, cpf);
			ps.setDouble(3, credito);
			ps.setString(4, rua);
			ps.setString(5, cep);
			ps.setString(6, numero);
			ps.setString(7, login);
			ps.setString(8, passwd);
			ps.setString(9, email);
			Banco.executePreparedStatement(ps);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return c;
	}

	public static void updateCliente(String nome, String email,
			String login, String senha, String telefone, String cpf,
			String rua, String numero, String adicional, String cep)
			throws SQLException {
		String sql = "UPDATE Cliente SET nome='" + nome + "', email='" + email
				+ "',passwd='" + senha + "',telefone='" + telefone
				+ "',end_add='" + adicional + "',cpf='" + cpf + "',end_rua='"
				+ rua + "',end_num='" + numero + "',end_cep='" + cep
				+ "' WHERE login='" + login + "'";
		Banco.executeQuery(sql);
	}

	public static void updateCliente(Cliente a) throws SQLException {
		int id = a.getId();
		String nome = a.getNome();
		String email = a.getEmail();
		String login = a.getLogin();
		String senha = a.getSenha();
		String telefone = a.getTelefone();
		String cpf = a.getCpf();
		String rua = a.endereco.getRua();
		String numero = a.endereco.getNumero();
		String adicional = a.endereco.getAdicional();
		String cep = a.endereco.getCep();
		double credito = a.getCredito();

		String sql = "UPDATE Cliente SET nome='" + nome + "' ,login='" + login
				+ "', credito=" + credito + " email='" + email + "',passwd='"
				+ senha + "',telefone='" + telefone + "',end_add='" + adicional
				+ "',cpf='" + cpf + "',end_rua='" + rua + "',end_num='"
				+ numero + "',end_cep='" + cep + "' WHERE id=" + id + "";
		Banco.executeQuery(sql);

	}

	private String getSenha() {
		return senha;
	}

}
